<?php
class LcznEntidadDAO {
	
	public static function consultar($tabla, $campos, $filtro = "") {
		$entidades = array();

		$sql = " SELECT #campos# FROM #tabla# WHERE 1=1 #filtro# LIMIT 0, 25";
		$sql = str_replace("#campos#", self::strCampos($campos), $sql);
		$sql = str_replace("#tabla#", $tabla, $sql);
		$sql = str_replace("#filtro#", $filtro, $sql);

		$res = Dao::ejecuta($sql);

		while ($fila = $res->fetch()) {
			$entidad = new LcznEntidadVO();
			foreach ($campos as $campo) {
				$metodo = "set".ucfirst($campo->getNombre());
				$entidad->$metodo($fila[$campo->getNombre()]);
			}
			$entidades[] = $entidad;
		}
		
		$res = null;

		return $entidades;
	}
	
	public static function insertar($tabla, $campos, $entidad) {
		
		$strCampos = "";
		$strValores = "";
		$separador = "";
		
		foreach ($campos as $campo) {
			$strCampos.=$separador.$campo->getNombre();
			$strValores.= $separador.":".$campo->getNombre();
			$separador = ", ";
			$metodo = "get".ucfirst($campo->getNombre());
			$params[":".$campo->getNombre()] = Sql::frmCampo($entidad->$metodo(), $campo->getTipo());
		}

		$sql = "INSERT INTO #tabla# (#campos#) VALUES (#valores#);";
		$sql = str_replace("#tabla#", $tabla, $sql);
		$sql = str_replace("#campos#", $strCampos, $sql);
		$sql = str_replace("#valores#", $strValores, $sql);

		$id = Dao::ejecuta($sql, $params);
		
		return $id;
	}
	
	public static function actualizar($tabla, $campos, $entidad) {
		$strCampos = "";
		$strClaves = "";
		$separador1 = "";
		$separador2 = "";
		
//		Util::depura($campos);
		foreach ($campos as $campo) {
			if ($campo->getDeshabilitado() == false) {
				if ($campo->getClave() == true) {
					$strClaves.= $separador1.$campo->getNombre()." = :".$campo->getNombre();
					$separador1 = " AND ";
				} else {
					$strCampos.=$separador2.$campo->getNombre()." = :".$campo->getNombre();
					$separador2 = ", ";
				}
				
				$metodo = "get".ucfirst($campo->getNombre());
				$params[":".$campo->getNombre()] = Sql::frmCampo($entidad->$metodo(), $campo->getTipo());
			}
		}
		
		$sql = "UPDATE #tabla# SET #campos# WHERE #claves#;";
		$sql = str_replace("#tabla#", $tabla, $sql);
		$sql = str_replace("#campos#", $strCampos, $sql);
		$sql = str_replace("#claves#", $strClaves, $sql);

		//Util::depura($params);

		Dao::ejecuta($sql, $params);
	}
	
	public static function eliminar($tabla, $claves) {
		
		$separador = "";
		$strClaves = "";

		foreach($claves as $clave => $valor) {
			$strClaves.= $separador.$clave." = ".$valor;
			$separador = " AND ";
		}
		
		$sql = "DELETE FROM #tabla# WHERE #claves#";
		$sql = str_replace("#tabla#", $tabla, $sql);
		$sql = str_replace("#claves#", $strClaves, $sql);

		Dao::ejecuta($sql);
	}
	
	private static function strCampos($campos) {
		$cadena = "";
		$separador = "";
		
		foreach ($campos as $campo) {
			$cadena.=$separador.$campo->getNombre();
			$separador = ", ";
		}
		
		return $cadena;
	}
	
	public static function filtroIdEntidad($claves) {
		$sql = "";

		foreach($claves as $clave => $valor) {
			$sql.=" AND #clave# = #valor#";
			$sql = str_replace("#clave#", $clave, $sql);
			$sql = str_replace("#valor#", intval($valor), $sql);
		}
		
		return $sql;
	}
	
	public static function filtroFkEntidad($tabla) {
		
		$url = new Url();

		$control = $url->control();
		
		$sql = "";
		
		if (isset($_SESSION["modelo"][$tabla]["fks"])) {
			foreach ($_SESSION["modelo"][$tabla]["fks"] as $fk) {
				if (isset($control[$fk[3]]["ids"])) {
					$sql.= " AND #clave# = #valor#";
					$sql = str_replace("#clave#", $fk[2], $sql);
					$sql = str_replace("#valor#", intval($control[$fk[3]]["ids"]), $sql);
				}
			}
		}

		return $sql;
	}
}
?>